package com.sqlcheck.service;

import com.sqlcheck.model.SqlStatement;

import java.util.List;

/**
 * SQL分批拆分服务接口
 * 职责：仅负责根据字符长度将SQL语句分批，不涉及具体的分析逻辑
 * 
 * @author Claude
 * @version v4.2
 * @since 2025-09-04
 */
public interface SqlBatchSplitter {

    /**
     * SQL批次信息
     */
    class SqlBatch {
        private final int batchNumber;
        private final List<SqlStatement> sqlStatements;
        private final int estimatedTokens;

        public SqlBatch(int batchNumber, List<SqlStatement> sqlStatements, int estimatedTokens) {
            this.batchNumber = batchNumber;
            this.sqlStatements = sqlStatements;
            this.estimatedTokens = estimatedTokens;
        }

        public int getBatchNumber() {
            return batchNumber;
        }

        public List<SqlStatement> getSqlStatements() {
            return sqlStatements;
        }

        public int getStatementCount() {
            return sqlStatements.size();
        }

        public int getEstimatedTokens() {
            return estimatedTokens;
        }
    }

    /**
     * 将SQL语句列表按字符长度分批
     * 
     * @param sqlStatements SQL语句列表
     * @param maxTokensPerBatch 每批最大token数
     * @param basePromptTokens 基础PROMPT的token数（用于计算可用空间）
     * @return SQL批次列表
     */
    List<SqlBatch> splitIntoBatches(List<SqlStatement> sqlStatements, int maxTokensPerBatch, int basePromptTokens);

    /**
     * 估算文本的token数量
     * 
     * @param text 待估算的文本
     * @return 估算的token数量
     */
    int estimateTokenCount(String text);

    /**
     * 估算SQL语句在PROMPT中的token占用
     * 
     * @param statement SQL语句
     * @param statementIndex 在批次中的索引
     * @return 估算的token数量
     */
    int estimateStatementTokens(SqlStatement statement, int statementIndex);

    /**
     * 检查是否需要进行批处理
     * 
     * @param sqlStatements SQL语句列表
     * @param maxTokensPerBatch 每批最大token数
     * @param basePromptTokens 基础PROMPT的token数
     * @return 是否需要批处理
     */
    boolean shouldUseBatchProcessing(List<SqlStatement> sqlStatements, int maxTokensPerBatch, int basePromptTokens);
}